package cpm.arctic.coding.marvin.communication;

import java.io.DataInputStream;
import java.io.DataOutputStream;

import lejos.nxt.LCD;
import lejos.nxt.comm.BTConnection;
import lejos.nxt.comm.Bluetooth;
import lejos.nxt.comm.NXTConnection;

/**
 * Managt die Bluetoothverbindungen des NXT
 * 
 * @author ygraf
 *
 */
public class BluetoothHandler {
	
	private static BluetoothHandler 	instance;
	
	private BTConnection	 	btConnection;
	private DataOutputStream 	out;
	private DataInputStream 	in;
	
	/**
	 * Privater Konstruktor, da keine Instance des Handlers angelegt werden soll
	 */
	private BluetoothHandler() {}

	/**
	 * Inizialisiert den Handler
	 */
	public static void init() {
		instance = new BluetoothHandler();
	}
	
	/**
	 * Gibt eine Instance des Handlers zurueck
	 * 
	 * @return Die Instance des Handlers
	 */
	public static BluetoothHandler getInstance() {
		if (instance == null) {
			init();
		}
		return instance;
	}
	
	/**
	 * Wartet auf eine Verbindungsanfrage des NXTPhone und baut diese auf
	 * 
	 * @return true, wenn erfolgreich | false, wenn nicht erfolgreich
	 */
	public boolean connectToPhone() {
		
		boolean success = false;
		
		try {			
			
			LCD.clear();
			LCD.drawString("Warte auf Verbindung", 0, 1);
			btConnection = Bluetooth.waitForConnection();
			
			btConnection.setIOMode(NXTConnection.RAW); //FUCK !!!!
			
			in  = btConnection.openDataInputStream();
			out = btConnection.openDataOutputStream();
			
			success = true;
			
			LCD.clear();
			LCD.drawString("Verbindung hergestellt", 0, 1);
			
		} catch (Exception ex) {
			throw new CommunicationException("Fehler beim verbinden mit dem NXTPhone: " + ex);
		}
		
		return success;
		
	}
	
	/**
	 * Trennt die Verbindung zum NXTPhone
	 */
	public void disconnectPhone() {
		
		try {		
			if (btConnection != null) {				
				btConnection.close();
				in.close();
				out.close();				
			}
		} catch (Exception ex) {
			throw new CommunicationException("Fehler beim verbinden mit dem NXTPhone: " + ex);
		}
		
	}
	
	/**
	 * Prueft ob die Verbindung noch existiert
	 * 
	 * @return true, wenn ja | false, wenn nein
	 */
	public boolean isConnected() {
		return !(btConnection.available() == -1);
	}
	
	/**
	 * Gibt den OutputStream der Bluetoothverbindung zurueck
	 * 
	 * @return DataOutputStream der Verbindung
	 */
	public DataOutputStream getOutputStream() {
		return this.out;
	}
	
	/**
	 * Gibt den InputStream der Bluetoothverbindung zurueck
	 * 
	 * @return DataInputStream der Verbindung
	 */
	public DataInputStream getInputStream() {
		return this.in;
	}
	
	
	
	
	
}
